package it.csi.finregio.finreges.client.services;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.apache.struts.action.ActionForm;

import it.crp.crparch.web.struts.service.CRPStrutsService;
import it.crp.crparch.web.struts.service.WebServiceException;
import it.crp.exception.ServiceException;
import it.crp.logger.PrdLoggerFactory;
import it.csi.finregio.finreges.client.ServiceLocator;
import it.csi.finregio.finreges.dto.DestinatarioScheda;
import it.csi.finregio.finreges.dto.EnteScheda;
import it.csi.finregio.finreges.dto.NotaScadenza;
import it.csi.finregio.finreges.dto.Riferimento;
import it.csi.finregio.finreges.dto.Scheda;
import it.csi.finregio.finreges.integration.SchedaService;
import it.csi.finregio.finreges.presentation.form.EntiSchedaContainer;
import it.csi.finregio.finreges.presentation.form.SchedaForm;

public class DettaglioSchedaService implements CRPStrutsService {
	private Logger log = PrdLoggerFactory.getInstance().getLogger("finreges");

	public Object execute(ActionForm form) throws WebServiceException {
		log.info("[DettaglioSchedaService::execute] BEGIN");
		try {
			SchedaForm sf = (SchedaForm) form;
			HttpServletRequest request = sf.getRequest();
			String idScheda = request.getParameter("idSchedaSelected");
			log
					.debug("[DettaglioSchedaService::execute] IdScheda: "
							+ idScheda);
			SchedaService schedaService = new ServiceLocator()
					.getSchedaService();
			Riferimento[] rif = schedaService
					.findRiferimentoByIdScheda(idScheda);
			EnteScheda[] enteSchedas = schedaService
					.findEnteSchedaByIdScheda(idScheda);
			Scheda scheda = schedaService.findSchedaByIdScheda(idScheda);
			DestinatarioScheda destinatarioScheda = schedaService
					.findDestinatarioByIdScheda(idScheda);
			NotaScadenza notaScadenza = schedaService
					.findNotaScadenzaByIdScheda(idScheda);
			if (rif != null) {
				log
						.debug("[DettaglioSchedaService::execute] Aggiungo riferimenti scheda. Numero riferimenti: "
								+ rif.length);
				CollectionUtils
						.addAll(sf.getTabellaRiferimentiNormativi(), rif);
			}
			if (enteSchedas != null) {
				log
						.debug("[DettaglioSchedaService::execute] Aggiungo enti scheda. Numero enti scheda: "
								+ enteSchedas.length);
				EntiSchedaContainer entiSchedaContainer = new EntiSchedaContainer();
				for (int i = 0; i < enteSchedas.length; i++) {
					EnteScheda es = enteSchedas[i];
					entiSchedaContainer.add(es.getEnte(), es, Integer
							.parseInt(es.getModalitaInserimento()));
				}
				sf.setTabellaInformazioniAssEnte(entiSchedaContainer);
			}
			if (destinatarioScheda != null) {
				log
						.debug("[DettaglioSchedaService::execute] Aggiungo destinatari scheda. ");
				log.debug("[DettaglioSchedaService::execute]  "
						+ destinatarioScheda);
				sf.setIdDestinatario(destinatarioScheda.getIdDestinatario());
				sf.setDestinatari(destinatarioScheda.getDestinatari());
				sf.setNoteDestinatari(destinatarioScheda.getNoteDestinatari());
				sf.setProcedura(destinatarioScheda.getProcedura());
				sf.setNoteProcedura(destinatarioScheda.getNoteProcedura());
				sf.setLinkAssEnte(destinatarioScheda.getLinkAssEnte());
				sf.setFinanziamenti(destinatarioScheda.getFinanziamenti());
				sf.setNoteFinanziamenti(destinatarioScheda
						.getNoteFinanziamenti());
			}
			if(notaScadenza!=null){
				log.debug("[DettaglioSchedaService::execute] Aggiungo note scadenza: "+notaScadenza);
				sf.setNoteInterne(notaScadenza.getNotaInterna());
				sf.setIdNota(notaScadenza.getIdNota());
				if(notaScadenza.getDataScadenza()!=null){
					sf.setDataScadenza(notaScadenza.getDataScadenza());
					sf.setTipoInserimento("1");
				}
				if(notaScadenza.getTermineScadenza()!=null){
					sf.setTermineScadenza(notaScadenza.getTermineScadenza());
					sf.setTipoInserimento("2");
				}
			}
			
			sf.setIdScheda(scheda.getIdScheda());
			sf.setAnno(scheda.getAnno());
			sf.setNumeroQuaderno(scheda.getNumeroQuaderno());
			sf.setProgressivo(scheda.getProgressivo());
			sf.setClassificazione(scheda.getClassificazione().getIdClassificazione());
			sf.setSottoClassificazione(scheda.getSottoClassificazione()==null?null:scheda.getSottoClassificazione().getIdSottoClassificazione());
			sf.setNoteClassificazione(scheda.getNoteClassificazione());
			sf.setTitolo(scheda.getTitolo());
			sf.setNoteAlTitolo(scheda.getNoteTitolo());
			sf.setStatoScheda(scheda.getStato().getIdStato());
			return sf;
		} catch (ServiceException e) {
			log
					.error("[DettaglioSchedaService::execute]  "
							+ e.getMessage(), e);
			throw new WebServiceException(e.getMessage());
		} finally {
			log.info("[DettaglioSchedaService::execute] END");
		}
	}

}
